package com.liao.controller;

import com.liao.common.Result;
import com.liao.dto.LoginDTO;
import com.liao.dto.RegisterDTO;
import com.liao.entity.User;
import com.liao.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/users")
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 用户登录
     *
     * @param loginDTO 登录信息
     * @return 登录结果
     */
    @PostMapping("/login")
    public Result<Map<String, Object>> login(@RequestBody @Valid LoginDTO loginDTO) {
        // 调用登录服务
        User user = userService.login(loginDTO);
        
        // 生成简单的token（实际项目中应使用JWT等更安全的方式）
        String token = "user_" + user.getId() + "_" + System.currentTimeMillis();
        
        // 返回用户信息和token
        Map<String, Object> map = new HashMap<>();
        map.put("token", token);
        map.put("user", user);
        
        return Result.success(map);
    }

    /**
     * 用户注册
     *
     * @param registerDTO 注册信息
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result<User> register(@RequestBody @Valid RegisterDTO registerDTO) {
        User user = userService.register(registerDTO);
        return Result.success(user);
    }

    /**
     * 获取当前用户信息
     *
     * @return 用户信息
     */
    @GetMapping("/info")
    public Result<User> getUserInfo(@RequestHeader("Authorization") String token) {
        // 从token中解析用户ID（实际项目中应使用JWT等更安全的方式）
        if (token == null || !token.startsWith("Bearer ")) {
            return Result.error(401, "未登录或token已过期");
        }
        
        String tokenValue = token.substring(7);
        if (!tokenValue.startsWith("user_")) {
            return Result.error(401, "token无效");
        }
        
        String[] parts = tokenValue.split("_");
        if (parts.length < 2) {
            return Result.error(401, "token无效");
        }
        
        Long userId;
        try {
            userId = Long.parseLong(parts[1]);
        } catch (NumberFormatException e) {
            return Result.error(401, "token无效");
        }
        
        // 获取用户信息
        User user = userService.getById(userId);
        if (user == null) {
            return Result.error(401, "用户不存在");
        }
        
        // 清除敏感信息
        user.setPassword(null);
        
        return Result.success(user);
    }

    /**
     * 修改密码
     *
     * @param data 密码信息
     * @return 修改结果
     */
    @PutMapping("/password")
    public Result<Boolean> changePassword(@RequestBody Map<String, String> data, 
                                         @RequestHeader("Authorization") String token) {
        // 从token中解析用户ID
        if (token == null || !token.startsWith("Bearer ")) {
            return Result.error(401, "未登录或token已过期");
        }
        
        String tokenValue = token.substring(7);
        if (!tokenValue.startsWith("user_")) {
            return Result.error(401, "token无效");
        }
        
        String[] parts = tokenValue.split("_");
        if (parts.length < 2) {
            return Result.error(401, "token无效");
        }
        
        Long userId;
        try {
            userId = Long.parseLong(parts[1]);
        } catch (NumberFormatException e) {
            return Result.error(401, "token无效");
        }
        
        // 获取旧密码和新密码
        String oldPassword = data.get("oldPassword");
        String newPassword = data.get("newPassword");
        
        if (oldPassword == null || newPassword == null) {
            return Result.error("旧密码和新密码不能为空");
        }
        
        // 获取用户信息
        User user = userService.getById(userId);
        if (user == null) {
            return Result.error(401, "用户不存在");
        }
        
        // 验证旧密码
        if (!user.getPassword().equals(oldPassword)) {
            return Result.error("旧密码不正确");
        }
        
        // 更新密码
        user.setPassword(newPassword);
        boolean result = userService.updateById(user);
        
        return Result.success(result);
    }

    /**
     * 退出登录
     *
     * @return 退出结果
     */
    @PostMapping("/logout")
    public Result<Boolean> logout() {
        // 实际项目中应该使用Redis等存储token并在此处删除
        return Result.success(true);
    }
}